package com.hrzyit.base.utils

import android.content.Context
import android.media.MediaRecorder
import android.os.Environment
import android.os.Handler
import android.util.Log

import java.io.File
import java.io.IOException


class AudioRecorderUtils constructor(//文件夹路径
    private val audioPath:String
//    String = Environment.getExternalStorageDirectory().toString() + "/cadyd/record/"
) {

    //文件路径
    private var filePath: String? = null

    private var mMediaRecorder: MediaRecorder? = null
    private val TAG = "fan"

    private var audioStatusUpdateListener: OnAudioStatusUpdateListener? = null

    private var startTime: Long = 0
    private var endTime: Long = 0

    private val mHandler = Handler()
    private val mUpdateMicStatusTimer = Runnable { updateMicStatus() }


    private val BASE = 1
    private val SPACE = 100// 间隔取样时间

//    init {

//        val path = File(FolderPath)
//        if (!path.exists())
//            path.mkdirs()
//    }

    /**
     * 开始录音 使用amr格式
     * 录音文件
     *
     * @return
     */
    fun startRecord(context: Context) {
        if (!CheckPermissionUtils.isHasPermission(context)) {
            audioStatusUpdateListener!!.onError()
            return
        }
        // 开始录音
        /* ①Initial：实例化MediaRecorder对象 */
        if (mMediaRecorder == null)
            mMediaRecorder = MediaRecorder()
        try {
            /* ②setAudioSource/setVedioSource */
            mMediaRecorder!!.setAudioSource(MediaRecorder.AudioSource.MIC)// 设置麦克风
            /* ②设置音频文件的编码：AAC/AMR_NB/AMR_MB/Default 声音的（波形）的采样 */
            mMediaRecorder!!.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT)
            /*
             * ②设置输出文件的格式：THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
             * ，H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
             */
            mMediaRecorder!!.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
            filePath?.let {

            }
//            filePath = FolderPath + DateUtils.now + ".amr"

            filePath = audioPath

            /* ③准备 */
            mMediaRecorder!!.setOutputFile(filePath)
            mMediaRecorder!!.setMaxDuration(MAX_LENGTH)
            mMediaRecorder!!.prepare()
            /* ④开始 */
            mMediaRecorder!!.start()
            // AudioRecord audioRecord.
            /* 获取开始时间* */
            startTime = System.currentTimeMillis()
            updateMicStatus()
            Log.e("fan", "startTime$startTime")
        } catch (e: IllegalStateException) {
            audioStatusUpdateListener!!.onError()
            Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.message)
        } catch (e: IOException) {
            audioStatusUpdateListener!!.onError()
            Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.message)
        }

    }

    /**
     * 停止录音
     */
    fun stopRecord(): Long {
        if (mMediaRecorder == null)
            return 0L
        endTime = System.currentTimeMillis()
        //设置后不会崩
        mMediaRecorder!!.setOnErrorListener(null)
        mMediaRecorder!!.setPreviewDisplay(null)
        try {
            mMediaRecorder!!.stop()
        } catch (e: IllegalStateException) {
            Log.d("stopRecord", e.message)
        } catch (e: RuntimeException) {
            Log.d("stopRecord", e.message)
        } catch (e: Exception) {
            Log.d("stopRecord", e.message)
        }

        mMediaRecorder!!.reset()
        mMediaRecorder!!.release()
        mMediaRecorder = null
        val time = endTime - startTime
        audioStatusUpdateListener!!.onStop(time, filePath)
        filePath = ""
        return endTime - startTime
    }

    /**
     * 取消录音
     */
    fun cancelRecord() {
        if (mMediaRecorder != null) {
            mMediaRecorder!!.stop()
            mMediaRecorder!!.reset()
            mMediaRecorder!!.release()
            mMediaRecorder = null
        }
        val file = File(filePath!!)
        if (file.exists())
            file.delete()
        audioStatusUpdateListener!!.onCancel(0L)
        filePath = ""

    }

    fun setOnAudioStatusUpdateListener(audioStatusUpdateListener: OnAudioStatusUpdateListener) {
        this.audioStatusUpdateListener = audioStatusUpdateListener
    }

    /**
     * 更新麦克状态
     */
    private fun updateMicStatus() {

        if (mMediaRecorder != null) {
            val ratio = mMediaRecorder!!.maxAmplitude.toDouble() / BASE
            var db: Double // 分贝
            if (ratio > 1) {
                db = 20 * Math.log10(ratio)
                if (null != audioStatusUpdateListener) {
                    audioStatusUpdateListener!!.onUpdate(db, System.currentTimeMillis() - startTime)
                }
            }
            mHandler.postDelayed(mUpdateMicStatusTimer, SPACE.toLong())
        }
    }

    interface OnAudioStatusUpdateListener {
        /**
         * 录音中...
         *
         * @param db   当前声音分贝
         * @param time 录音时长
         */
        fun onUpdate(db: Double, time: Long)

        /**
         * 停止录音
         *
         * @param time     录音时长
         * @param filePath 保存路径
         */
        fun onStop(time: Long, filePath: String?)

        /**
         * 录音失败
         */
        fun onError()

        /**
         * 取消录音
         */
        fun onCancel(time:Long)
    }

    companion object {
        val MAX_LENGTH = 1000 * 60 * 10// 最大录音时长1000*60*10;
    }

}
/**
 * 文件存储默认sdcard/whistle/record
 *///默认保存路径为/sdcard/record/下
